package logger

import "github.com/gin-gonic/gin"

const contextLoggerKey = "context_logger"

// InjectContextLogger 将上下文 Logger 写入 gin.Context
func InjectContextLogger(c *gin.Context, log Logger) {
	if c == nil || log == nil {
		return
	}
	c.Set(contextLoggerKey, log)
}

// FromContext 获取带 request_id 的 Logger，必要时基于 fallback 创建
func FromContext(c *gin.Context, fallback Logger) Logger {
	if c != nil {
		if val, exists := c.Get(contextLoggerKey); exists {
			if ctxLogger, ok := val.(Logger); ok && ctxLogger != nil {
				return ctxLogger
			}
		}
	}

	if fallback == nil {
		fallback = GetGlobalLogger()
	}

	ctxLogger := fallback
	if c != nil {
		ctxLogger = fallback.WithRequestID(c)
	}

	InjectContextLogger(c, ctxLogger)
	return ctxLogger
}

// Ctx 使用全局 Logger 作为回退获取上下文 Logger
func Ctx(c *gin.Context) Logger {
	return FromContext(c, GetGlobalLogger())
}
